﻿# CMakeList.txt: 3DPCL 的 CMake 项目，在此处包括源代码并定义
# 项目特定的逻辑。
#
cmake_minimum_required (VERSION 3.10)

# 将源代码添加到此项目的可执行文件。
add_executable (3DPCL 
	"playPCL.cpp" 
	"playPCL.h" 
	"main.cpp" 
	"mainMenu.ui"
 "SparseReconstructor.cpp" "SparseReconstructor.h")

# 链接依赖库（PRIVATE 表示仅当前目标使用，不传递给依赖它的其他目标）
target_link_libraries(3DPCL PRIVATE
    Qt5::Widgets           # Qt Widgets 模块
    ${PCL_LIBRARIES}       # PCL 库（自动包含选定的模块）
    ${OpenCV_LIBS}         # OpenCV 库（由 find_package 自动生成，含 Debug/Release 区分）
    ${VTK_LIBS} 
)

# 统一输出目录（方便管理可执行文件和依赖DLL）
set_target_properties(3DPCL PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/bin/Debug"
    RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/bin/Release"
)

# 自动复制依赖DLL到输出目录（Windows特有，解决运行时缺失DLL问题）
if(MSVC)
    # 1. 确保目标目录存在（避免路径不存在导致复制失败）
    add_custom_command(TARGET 3DPCL PRE_BUILD
        COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_FILE_DIR:3DPCL>
    )

    # 2. 复制 PCL DLL（根据编译模式匹配 Debug/Release 版本）
    add_custom_command(TARGET 3DPCL POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
        # Debug模式：DLL名称带d后缀（如pcl_commond.dll）
        # Release模式：DLL名称无后缀（如pcl_common.dll）
        "$<IF:$<CONFIG:Debug>,${PCL_ROOT}/bin/pcl_commond.dll,${PCL_ROOT}/bin/pcl_common.dll>"
        "$<IF:$<CONFIG:Debug>,${PCL_ROOT}/bin/pcl_iod.dll,${PCL_ROOT}/bin/pcl_io.dll>"
        "$<IF:$<CONFIG:Debug>,${PCL_ROOT}/bin/pcl_visualizationd.dll,${PCL_ROOT}/bin/pcl_visualization.dll>"
        $<TARGET_FILE_DIR:3DPCL>
    )

    # 3. 复制 Qt DLL（Qt 自动区分 Debug/Release，Debug 版本带 d 后缀）
    add_custom_command(TARGET 3DPCL POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
        "$<TARGET_FILE:Qt5::Widgets>"  # 自动获取 Qt Widgets 的 DLL 路径（含版本匹配）
        $<TARGET_FILE_DIR:3DPCL>
    )

    # 4. 复制 OpenCV DLL（根据编译模式匹配）
    add_custom_command(TARGET 3DPCL POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
        "$<IF:$<CONFIG:Debug>,${OpenCV_DIR}/x64/vc16/bin/opencv_world440d.dll,${OpenCV_DIR}/x64/vc16/bin/opencv_world440.dll>"
        $<TARGET_FILE_DIR:3DPCL>
    )

    # 复制 VTK DLL 到目标输出目录（此时 3DPCL 目标已定义）
    if(EXISTS ${VTK_BIN_DIR})
    # 1. 用 GLOB 查找所有 Debug 版本的 VTK DLL（带 9.0d 后缀）
    file(GLOB VTK_DLL_FILES 
        "${VTK_BIN_DIR}/vtk*9.0d.dll"  # 匹配所有 vtk 开头、9.0d.dll 结尾的文件
    )

    # 2. 批量复制找到的 DLL 到输出目录
    add_custom_command(TARGET 3DPCL POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
            ${VTK_DLL_FILES}  # 传入所有找到的 DLL 路径
            $<TARGET_FILE_DIR:3DPCL>
    )
    else()
        message(WARNING "VTK Debug DLL 目录不存在：${VTK_BIN_DIR}，运行时可能缺失 DLL")
    endif()
endif()